home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / tclMotif-1.4 / addwidget next >
Text File  |  1995-06-29  |  6KB  |  212 lines

  1.  
  2. # this shell script adds an externally defined widget to the
  3. # src/tmExtern.c file. It uses a widget description from the
  4. # directory extern_widgets.
  5.  
  6. if [ $# -ne 1 ]
  7. then
  8.     echo "Usage: $0 widget"
  9.     exit 1
  10. fi
  11.  
  12. WFILE=extern_widgets/$1
  13. if [ ! -r $WFILE ]
  14. then
  15.     echo "Can\'t open widget description file \"$WFILE\""
  16.     exit 2
  17. fi
  18.  
  19. # the widget descrition is stored in format
  20. #    widget tcl-command Xtclass create-command method-handler
  21. # there may be many defs in WFILE, so save them in a file, one per line
  22. # for all of these, allow arbitrary white space before the keyword
  23.  
  24. sed -n 's/^[     ]*widget[     ]*//p' $WFILE > tmp_widgets
  25.  
  26. # if there are include files required, they are stored as
  27. #    include-file  <file>
  28. # multiple includes are allowed, one per line
  29.  
  30. grep '^[   ]*include-file' $WFILE | awk '{print $2}' > tmp_includes
  31.  
  32. # if there are any reasons, they are stored as
  33. #    reason <reason> <reason-string"
  34. # multiple reasons are allowed, one per line, so save them in a file
  35.  
  36. # To allow white space of {tab | space}, change all tabs to spaces first :-(`
  37. tr "    " " " < $WFILE | grep '^[   ]*reason' | awk '{print $2 " " $3}' > tmp_reasons
  38.  
  39. # the directory include directive for the Imakefile is stored as
  40. #    include-dir <dir>
  41.  
  42. include_dir=`grep '^[   ]*include-dir' $WFILE | awk '{print $2}'`
  43.  
  44. # the library directive for the Imakefile is stored as
  45. #    library <lib>
  46.  
  47. library=`grep '^[   ]*library' $WFILE | awk '{print $2}'`
  48.  
  49.  
  50. # debug: echo $tcl_command $xt_class $create_func $method_func $includes $reasons
  51.  
  52. #-----------------------------------------------------------------------
  53.  
  54. #
  55. # Now we are going to embark on a series of edit jobs to patch up
  56. # the various arrays in tmExtern.c. I use awk here because it finds
  57. # the relevant lines easily for the editing. I could use one big awk
  58. # statement, but right now I feel happier doing it one step at a time
  59. #
  60.  
  61. # make a copy first, in case it stuffs up
  62. cp src/tmExtern.c src/tmExtern.c.orig
  63.  
  64. # there may be multiple widget descriptions in a file, each belonging
  65. # to the one set of includes and libraries
  66.  
  67. # loop through each widget description
  68. cat tmp_widgets | \
  69. while read tcl_command xt_class create_func method_func
  70. do
  71.  
  72.     if [ -z "$tcl_command" ]
  73.     then echo "Can\'t find tcl_command for this widget"
  74.         exit 3
  75.     fi
  76.     if [ -z "$xt_class" ]
  77.     then echo "Can\'t find Xt class for widget $tcl_command"
  78.         exit 4
  79.     fi
  80.     if [ -z "$create_func" ]
  81.     then echo "Can\'t find creation function for widget $tcl_command"
  82.         exit 5
  83.     fi
  84.     if [ -z "$method_func" ]
  85.     then echo "Can\'t find method function for widget $tcl_command"
  86.         exit 6
  87.     fi
  88.  
  89.     # now edit the src file
  90.     awk '
  91.             { print $0 }
  92.  
  93.         # Patch up the Tm_ExternCommands array by adding in an entry of the form
  94.         #    {tcl_command, create_func, method_func},
  95.         /Tm_Cmd Tm_ExternCommands/ \
  96.         {
  97.           print "    {\"" TCL_COMMAND "\",    " CREATE ",    " METHOD "},"
  98.         }
  99.         
  100.         # Patch up the Tm_ExternCommandToClass array by adding in an entry of the form
  101.         #    {tcl_command, xt_class},
  102.         /Tm_CommandToClassType Tm_ExternCommandToClass/ \
  103.         {
  104.           print "    {\"" TCL_COMMAND "\",    &" CLASS  "},"
  105.         }
  106.     ' TCL_COMMAND=$tcl_command CLASS=$xt_class \
  107.       CREATE=$create_func METHOD=$method_func src/tmExtern.c > tmp
  108.  
  109.     mv tmp src/tmExtern.c
  110. done
  111.         
  112.  
  113. # Insert the include file declarations after <Xm/Xm.h>
  114. cat tmp_includes | \
  115. while read includes
  116. do
  117.     awk '
  118.         { print $0 }
  119.         /Xm\/Xm.h/ \
  120.         {
  121.               print "#include " INCLUDES
  122.         }
  123.     ' INCLUDES="$includes" src/tmExtern.c > tmp3
  124.     mv tmp3 src/tmExtern.c
  125. done
  126.  
  127. # Patch up the  Tm_ExternReasons array by adding in an entry of the form
  128. #       {reason, reason-string},
  129. cat tmp_reasons | \
  130. while read reasons
  131. do
  132.     awk '
  133.         { print $0 }
  134.         /Tm_ReasonType Tm_ExternReasons/ \
  135.         {
  136.             split(REASONS, line)
  137.             print "    {" line[1] ",    \"" line[2] "\"},"
  138.         }
  139.     ' REASONS="$reasons" src/tmExtern.c > tmp4
  140.     mv tmp4 src/tmExtern.c
  141. done
  142.  
  143. #-----------------------------------------------------------------------
  144.  
  145. # now we get to add in the extra C code that belongs to/defines the
  146. # various widget stuff
  147.  
  148. # If there is initialisation stuff, insert it now
  149. if [ -r ${WFILE}.initialise ]
  150. then
  151.     awk '
  152.             { print $0 }
  153.         /Place your own external widgets initialisation code here/ \
  154.            {
  155.            system("cat " INIT_FILE)
  156.         }
  157.     ' INIT_FILE=${WFILE}.initialise src/tmExtern.c > tmp5
  158. else
  159.     cp src/tmExtern.c tmp5
  160. fi
  161.  
  162. # If there is expand percents stuff, insert it now
  163. if [ -r ${WFILE}.expand ]
  164. then
  165.     awk '
  166.             { print $0 }
  167.         /Place your own external widgets expand percents code here/ \
  168.            {
  169.            system("cat " EXPAND_FILE)
  170.         }
  171.     ' EXPAND_FILE=${WFILE}.expand tmp5 > tmp6
  172. else
  173.     mv tmp5 tmp6
  174. fi
  175.  
  176. # If there is any additional code stuff to be added for this widget
  177. # do it now
  178. if [ -r ${WFILE}.commands ]
  179. then
  180.     cat tmp6 ${WFILE}.commands > tmp7
  181. else
  182.     mv tmp6 tmp7
  183. fi
  184.  
  185. #
  186. # We are done with tmExtern.c - move the file back over what we started from,
  187. # cross our fingers (well, yours at least - mine are bent enough)
  188. # and move onwards (and upwards, and sideways, and....)
  189. mv tmp7 tmExtern.c
  190.  
  191. #----------------------------------------------------------------------#--------------------------------------------------------------------------
  192. # Now to fix up the Imakefile
  193.  
  194. cp src/Imakefile src/Imakefile.orig
  195. awk '
  196.      $1 !~ /EXTRA_WIDGETS_INCLUDE/ && $1 !~ /EXTRA_WIDGETS_LIB/ \
  197.         { print $0 }
  198.     /EXTRA_WIDGETS_INCLUDE/ \
  199.     {
  200.       print $0, INCLUDE_DIR
  201.     }
  202.     /EXTRA_WIDGETS_LIB/ \
  203.     {
  204.       print $0, LIBRARY
  205.     }
  206. ' INCLUDE_DIR=$include_dir LIBRARY=$library src/Imakefile > tmp
  207. mv tmp src/Imakefile
  208.  
  209. rm -f tmp*
  210.  
  211. exit 0
  212.